package character;
//String字符串
import java.util.Arrays;

/**
 * 在java中字符串没有以/0结尾的说法
 */
public class Main {
    public static void func(String s,char[] array){
        s = "fjsa";
        array[0] = 'h';
    }
    public static void main(String[] args) {
        String s = "jfa";  //String不能被继承 是final修饰的  双引号引起来的字符串常量才放在字符串常量池里面
        //class文件常量池：int a = 10；运行时常量池：长须吧编译好的字节码文件加载到jvm中后
        // 会生成一个运行时常量池（放在方法区）实际上是class文件常量池
        //字符串常量池 主要存放字符串常量 本质上是一个哈希表 StringTable   池的作用： 提高效率的
        //哈希表 ： 一种数据结构存储数据的时候会根据一个映射关系（key % len）进行村塾需要设计一个函数（哈希函数）
        String s1 = new String("jdash");//调用构造方法进行构造对象
        char[] chars = {'a','b'};
        String s2 = new String(chars);//可以直接把字符数组转化为字符串
        System.out.println(s2);
        func(s1,chars);
        System.out.println(s1);//不是说传引用就能改变实参的值，你要看你的代码实现了什么
        System.out.println(Arrays.toString(chars));
        //比较字符串引用的内容是否相等  应用equals来比较  不用这个比较的就是地址了  也就是对象的引用
        String hh = null;
        String hh2 = "dsha";
        //System.out.println(hh.equals(hh2));//此时就会报空指针异常 但换个位置就不会了
        String h1 = "hello";
        String h2 = new String("hello");
        // 存放h1先在数组中以哈希方式存放（哈希值，String对象的地址，next）（其中String对象的
        // 地址存放string的地址其中包括val值 和hash  而val存放的就是整个字符串数组所在的地址）
        //而h2进来需要先找 存放的哈希表里面有没有 这个hello 常量  有的话 就再new一个String对象的地址其val直接指向这个字符串数组
        //没有的话  就要像 第一个进来一样存储  所以在这里连个是不相等了（虽然两个val都相同但String对象所在地址不同）
        String str = "Hello";
        String str2 = "He" + "llo";//此时他两都是常量编译的时候 就已经确定好了是"Hello"  所以两个是相等的
        String str3 = "He";
        String str4 = str3 + "llo";//此时str3 是变量 编译时不知道是啥  就不相等了 拼接后会产生新的对象  he 和llo是两个常量
        String a = "11";
        String b = new String("1") + new String("1");//双new完后拼接完后是StringBuilder对象的val
        // 存储的就是1 1字符数组的地址
        //这两个是不相等的


        String b1 = new String("1") + new String("1");
        b1.intern();//手动入池  可以吧  拼接后的 String的对象 整体放入池中 （此时池中没有这个对象才可以） 然后  再进来查找 11  就一样了
        // 但是一定要先拼接入池  后面进来查找的才能相等  如果先进来a1 池中有了这个对象 再手动入池就不一样了 就和上面的一样了
         String a1 = "11";


         String d = null;
         String d1 = "";
         //要判断时需要先 d1 == null && f1.length == 0; 判断


    }
}
